import multer from 'multer';
import path from 'path';
import fs from 'fs';
import { AppError } from '../utils/errors';

// 确保上传目录存在
const uploadDir = path.join(__dirname, '../../uploads');
const avatarDir = path.join(uploadDir, 'avatars');
const imagesDir = path.join(uploadDir, 'images');
const videosDir = path.join(uploadDir, 'videos');

// 创建所有必要的目录
const createDirectories = () => {
  const dirs = [uploadDir, avatarDir, imagesDir, videosDir];
  dirs.forEach(dir => {
    if (!fs.existsSync(dir)) {
      fs.mkdirSync(dir, { recursive: true });
    }
  });
};

createDirectories();

// 头像存储配置
const avatarStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, avatarDir);
  },
  filename: (req, file, cb) => {
    // 生成唯一文件名：时间戳 + 随机数 + 原始扩展名
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    const ext = path.extname(file.originalname);
    cb(null, `avatar-${uniqueSuffix}${ext}`);
  }
});

// 通用图片存储配置
const imageStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, imagesDir);
  },
  filename: (req, file, cb) => {
    // 生成唯一文件名：时间戳 + 随机数 + 原始扩展名
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    const ext = path.extname(file.originalname);
    const originalName = path.parse(file.originalname).name;
    // 清理文件名，移除特殊字符
    const cleanName = originalName.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, '');
    cb(null, `${cleanName}-${uniqueSuffix}${ext}`);
  }
});

// 视频存储配置
const videoStorage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, videosDir);
  },
  filename: (req, file, cb) => {
    // 生成唯一文件名：时间戳 + 随机数 + 原始扩展名
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    const ext = path.extname(file.originalname);
    const originalName = path.parse(file.originalname).name;
    // 清理文件名，移除特殊字符
    const cleanName = originalName.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, '');
    cb(null, `video-${cleanName}-${uniqueSuffix}${ext}`);
  }
});

// 允许的图片类型
const allowedImageTypes = [
  'image/jpeg',
  'image/jpg', 
  'image/png',
  'image/gif',
  'image/webp'
];

// 允许的视频类型
const allowedVideoTypes = [
  'video/mp4',
  'video/mpeg',
  'video/quicktime',
  'video/x-msvideo', // .avi
  'video/x-ms-wmv'   // .wmv
];

// 允许的图片文件扩展名
const allowedImageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp'];

// 允许的视频文件扩展名
const allowedVideoExtensions = ['.mp4', '.mpeg', '.mov', '.avi', '.wmv'];

// 图片文件过滤器
const imageFileFilter = (req: any, file: Express.Multer.File, cb: multer.FileFilterCallback) => {
  // 检查MIME类型
  if (!allowedImageTypes.includes(file.mimetype)) {
    return cb(new AppError(`不支持的文件类型: ${file.mimetype}。支持的类型: ${allowedImageTypes.join(', ')}`, 400));
  }

  // 检查文件扩展名
  const ext = path.extname(file.originalname).toLowerCase();
  if (!allowedImageExtensions.includes(ext)) {
    return cb(new AppError(`不支持的文件扩展名: ${ext}。支持的扩展名: ${allowedImageExtensions.join(', ')}`, 400));
  }

  // 检查文件名长度
  if (file.originalname.length > 255) {
    return cb(new AppError('文件名过长，请使用较短的文件名', 400));
  }

  cb(null, true);
};

// 视频文件过滤器
const videoFileFilter = (req: any, file: Express.Multer.File, cb: multer.FileFilterCallback) => {
  // 检查MIME类型
  if (!allowedVideoTypes.includes(file.mimetype)) {
    return cb(new AppError(`不支持的视频文件类型: ${file.mimetype}。支持的类型: ${allowedVideoTypes.join(', ')}`, 400));
  }

  // 检查文件扩展名
  const ext = path.extname(file.originalname).toLowerCase();
  if (!allowedVideoExtensions.includes(ext)) {
    return cb(new AppError(`不支持的视频文件扩展名: ${ext}。支持的扩展名: ${allowedVideoExtensions.join(', ')}`, 400));
  }

  // 检查文件名长度
  if (file.originalname.length > 255) {
    return cb(new AppError('文件名过长，请使用较短的文件名', 400));
  }

  cb(null, true);
};

// 配置multer - 头像上传
export const uploadAvatar = multer({
  storage: avatarStorage,
  fileFilter: imageFileFilter,
  limits: {
    fileSize: 5 * 1024 * 1024, // 5MB
    files: 1 // 只允许上传一个文件
  }
}).single('avatar'); // 字段名为 'avatar'

// 配置multer - 通用图片上传
export const uploadImage = multer({
  storage: imageStorage,
  fileFilter: imageFileFilter,
  limits: {
    fileSize: 10 * 1024 * 1024, // 10MB
    files: 1 // 只允许上传一个文件
  }
}).single('image'); // 字段名为 'image'

// 配置multer - 多图片上传
export const uploadMultipleImages = multer({
  storage: imageStorage,
  fileFilter: imageFileFilter,
  limits: {
    fileSize: 10 * 1024 * 1024, // 每个文件10MB
    files: 10 // 最多10个文件
  }
}).array('images', 10); // 字段名为 'images'，最多10个文件

// 配置multer - 视频上传
export const uploadVideo = multer({
  storage: videoStorage,
  fileFilter: videoFileFilter,
  limits: {
    fileSize: 100 * 1024 * 1024, // 100MB
    files: 1 // 只允许上传一个文件
  }
}).single('video'); // 字段名为 'video'

// 错误处理中间件
export const handleUploadError = (error: any, req: any, res: any, next: any) => {
  if (error instanceof multer.MulterError) {
    let message = '文件上传失败';
    let statusCode = 400;

    switch (error.code) {
      case 'LIMIT_FILE_SIZE':
        message = '文件大小超出限制。单个文件不能超过10MB';
        statusCode = 413;
        break;
      case 'LIMIT_FILE_COUNT':
        message = '文件数量超出限制。最多只能上传10个文件';
        break;
      case 'LIMIT_UNEXPECTED_FILE':
        message = '意外的文件字段。请检查字段名是否正确';
        break;
      case 'LIMIT_PART_COUNT':
        message = '表单字段过多';
        break;
      case 'LIMIT_FIELD_KEY':
        message = '字段名过长';
        break;
      case 'LIMIT_FIELD_VALUE':
        message = '字段值过长';
        break;
      case 'LIMIT_FIELD_COUNT':
        message = '字段数量过多';
        break;
      default:
        message = `文件上传错误: ${error.message}`;
    }

    return res.status(statusCode).json({
      success: false,
      message,
      error: {
        code: error.code,
        field: error.field
      }
    });
  }
  
  if (error instanceof AppError) {
    return res.status(error.statusCode).json({
      success: false,
      message: error.message
    });
  }
  
  next(error);
};